from flask import Flask, url_for, request, session, render_template, send_from_directory
from werkzeug.exceptions import abort
from werkzeug.utils import redirect

from helper import template_or_json, get_games_from_db, get_game, login_required


"""
同时支持传统方式和Restful式的增删改查，当接收到ajax请求（request.is_xhr）时返回json数据，当接收到普通http请求时调用模板。

Restful API:

-  GET /games/ - 显示游戏列表
-  GET /games/3/ - 查询id为3的游戏
-  POST /games/ - 新增游戏记录
-  PUT /games/3/ - 更新id为3的游戏记录
-  PATCH /games/3/ - 部分更新
-  DELETE /games/3/ - 删除id为3的游戏记录

传统方式：

-  GET /games/ - 显示游戏列表
-  GET /games/3/ - 查询id为3的游戏
-  GET /games/add/ - 显示新增游戏的表单页面
-  POST /games/add/ - 新增游戏记录
-  GET /games/3/edit/ - 显示id为3的游戏的编辑页面
-  POST /games/3/edit/ - 更新id为3的游戏记录
-  GET/POST /games/3/delete/ - 删除id为3的游戏

表单页面也可以在网页端用js做

"""
app = Flask(__name__)


# session加密的秘钥，上线了需要重新生成一个
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'


@app.route('/')
def index():
    # 尝试用js输出页面
    return app.send_static_file('index.html')
    # return redirect(url_for('show_game_list'))


@app.route('/games/')
@template_or_json('game_list.html')
def show_game_list():
    return {'games': get_games_from_db()}


# slug可选
@app.route('/games/<int:game_id>/', methods=['GET'])
@app.route('/games/<int:game_id>/<slug>', methods=['GET'])
@template_or_json('game.html')
def show_game(game_id, slug=None):
    game = get_game(game_id)
    if not game:
        abort(404)
    return game


@app.route('/games/<game_id>/edit/', methods=['POST'])
@app.route('/games/<game_id>/', methods=['PUT'])
@login_required
@template_or_json('result.html')
def update_game(game_id):
    return {
        'success': True,
        'error_code': 0,
        'message': 'id为%s的游戏记录已经更新，点击<a href=%s>这里</a>查看。' % (game_id, url_for('show_game', game_id=game_id))
    }


@app.route('/games/<game_id>/delete/', methods=['GET', 'POST'])
@app.route('/games/<game_id>/', methods=['DELETE'])
@login_required
@template_or_json('result.html')
def delete_game(game_id):
    return {
        'success': False,
        'error_code': 403,
        'message': '记录删除失败，没有权限，'
    }


@app.route('/login/', methods=['POST'])
@template_or_json('result.html')
def login():
    if request.form['username'] == 'admin' and request.form['password'] == '123456':
        session['logged_in'] = True
        return {
            'success': True,
            'error_code': 0,
            'message': '登陆成功，'
        }
    return {
        'success': False,
        'error_code': 403,
        'message': '登陆失败'
    }


@app.route('/login/', methods=['GET'])
def show_login_form():
    return render_template('login.html')


@app.route('/logout/', methods=['GET', 'POST'])
@template_or_json('result.html')
def logout():
    session.pop('logged_in', None)
    return {
        'success': True,
        'error_code': 0,
        'message': '退出成功，'
    }


if __name__ == '__main__':
    app.run(debug=True, port=4000)